package collection;

import java.util.HashSet;

/**
 * HashSet扩容机制
 */
public class HashSetIncrement {

    public static void main(String[] args) {

        /*
            HashSet底层是HashMap，第一次添加时，table数组扩容到16，临界值(threshold)是 16 * 加载因子(loadFactor)是0.75 = 12
            如果table数组使用到了临界值12，就会扩容到 16 * 2 = 32，新的临界值就是 32 * 0.75 = 24，以此类推
            在 java8 中，如果一条链表的元素个数达到 TREEIFY_THRESHOLD (8)，且 table大小 >= MIN_TREEIFY_CAPACITY(64),就会进行树化

            可以debug以下代码验证
         */

        HashSet hashSet = new HashSet();

        for(int i = 1; i <= 100; i++) {
            hashSet.add(i);//1,2,3,4,5...100
        }

        for (int i = 0; i <= 12; i++) {
            hashSet.add(new A(i)); //equals() 不同
        }
        System.out.println("hashSet=" + hashSet);
    }
}

class A {

    private int n;

    public A(int n) {
        this.n = n;
    }

    @Override
    public int hashCode() {
        return 100;
    }
}